package io.github.echarts.model.adapter.series;

import io.github.echarts.model.SeriesModel;
import io.github.echarts.model.context.ConfigurationContext;
import io.github.echarts.option.series.SeriesOption;

/**
 * 系列类型适配器抽象基类
 * <p>
 * 该类提供系列类型适配器的通用功能，具体系列类型的适配器可以继承此类。
 * </p>
 */
public abstract class AbstractSeriesTypeAdapter implements SeriesTypeAdapter {
    
    /**
     * 系列类型
     */
    protected final String seriesType;
    
    /**
     * 构造函数
     * 
     * @param seriesType 系列类型
     */
    protected AbstractSeriesTypeAdapter(String seriesType) {
        this.seriesType = seriesType;
    }
    
    @Override
    public boolean supports(String seriesType) {
        return this.seriesType.equals(seriesType);
    }
    
    @Override
    public DataRangeOptimization getDataRangeOptimization(SeriesModel seriesModel, ConfigurationContext context) {
        DataRangeOptimization optimization = new DataRangeOptimization();
        
        // 柱状图、面积图等默认从0开始
        if (isBarOrAreaType()) {
            optimization.setStartWithZero(true);
        }
        
        // 折线图、散点图等默认不需要从0开始
        if (isLineOrScatterType()) {
            optimization.setStartWithZero(false);
            // 折线图适合更小的边距
            optimization.setExpandPercentage(0.03);
        }
        
        // 如果存在负值，需要包含负轴
        if (context.getDataStatistics().isHasNegativeValues()) {
            optimization.setIncludeNegativeAxis(true);
        }
        
        return optimization;
    }
    
    /**
     * 判断是否为柱状图或面积图
     * 
     * @return 如果是柱状图或面积图则返回true，否则返回false
     */
    protected boolean isBarOrAreaType() {
        return "bar".equals(seriesType) || "area".equals(seriesType);
    }
    
    /**
     * 判断是否为折线图或散点图
     * 
     * @return 如果是折线图或散点图则返回true，否则返回false
     */
    protected boolean isLineOrScatterType() {
        return "line".equals(seriesType) || "scatter".equals(seriesType);
    }
    
    /**
     * 根据数据特性优化配置
     * 
     * @param seriesModel 系列模型
     * @param context 配置上下文
     */
    protected void optimizeByDataFeatures(SeriesModel seriesModel, ConfigurationContext context) {
        // 根据数据特性优化配置的通用逻辑
        // 具体系列类型可以在其实现类中覆盖此方法
    }
    
    @Override
    public void optimizeVisualStyle(SeriesModel seriesModel, ConfigurationContext context) {
        // 基础的视觉样式优化，子类可以覆盖或扩展此方法
        optimizeByDataFeatures(seriesModel, context);
    }
} 